package com.skiving.cloud.admin.controller;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.skiving.cloud.auth.util.UserUtil;
import com.skiving.cloud.common.utils.PageParameter;
import com.skiving.cloud.common.utils.ReturnT;
import com.skiving.cloud.common.utils.UuidUtil;
import com.skiving.cloud.constant.AdminConstant;
import com.skiving.cloud.logutils.OperateLogLocal;
import org.noear.solon.annotation.*;
import org.noear.solon.core.util.MimeType;
import com.skiving.cloud.admin.entity.SysOrg;
import com.skiving.cloud.admin.service.SysOrgService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.noear.solon.data.annotation.CacheRemove;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 组织机构表 控制层。
 *
 * @author skivingcloud
 * @since 2025-03-08
 */
@Controller
@Api("组织机构表接口")
@Mapping("/sysOrg")
@Produces(MimeType.APPLICATION_JSON_UTF8_VALUE)
public class SysOrgController {

    @Inject
    private SysOrgService sysOrgService;

    /**
     * 添加组织机构表。
     *
     * @param sysOrg 组织机构表
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @Post
    @Mapping("/save")
    @ApiOperation("保存组织机构表")
    @OperateLogLocal(module="系统管理-组织机构管理", description = "新增组织机构")
    @CacheRemove(tags = "skivingOrg")
    public ReturnT<Boolean> save(@Body @ApiParam("组织机构表") SysOrg sysOrg) {
        QueryWrapper queryWrapper = QueryWrapper.create();
        queryWrapper.where(SysOrg::getOrgCode).eq(sysOrg.getOrgCode());
        boolean exists = sysOrgService.exists(queryWrapper);
        if(exists){
            return ReturnT.error("机构编号重复！");
        }
        sysOrg.setId(UuidUtil.get32UUID());
        sysOrg.setCreater(UserUtil.getCurrentUser().getId());
        sysOrg.setCreateTime(LocalDateTime.now());
        return ReturnT.ok(sysOrgService.save(sysOrg));
    }

    /**
     * 根据主键删除组织机构表。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @Get
    @Mapping("/remove/{id}")
    @ApiOperation("根据主键组织机构表")
    @OperateLogLocal(module="系统管理-组织机构管理", description = "删除组织机构")
    @CacheRemove(tags = "skivingOrg")
    public ReturnT<Boolean> remove(@Path @ApiParam("组织机构表主键") String id) {
        QueryWrapper queryWrapper = QueryWrapper.create();
        queryWrapper.where(SysOrg::getParentId).eq(id);
        boolean exists = sysOrgService.exists(queryWrapper);
        if(exists){
            return ReturnT.error("请先删除下级机构！");
        }
        return ReturnT.ok(sysOrgService.removeById(id));
    }

    /**
     * 根据主键更新组织机构表。
     *
     * @param sysOrg 组织机构表
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @Post
    @Mapping("/update")
    @ApiOperation("根据主键更新组织机构表")
    @OperateLogLocal(module="系统管理-组织机构管理", description = "修改组织机构")
    @CacheRemove(tags = "skivingOrg")
    public ReturnT<Boolean> update(@Body @ApiParam("组织机构表主键") SysOrg sysOrg) {
        QueryWrapper queryWrapper = QueryWrapper.create();
        queryWrapper.where(SysOrg::getOrgCode).eq(sysOrg.getOrgCode())
                .and(SysOrg::getId).ne(sysOrg.getId());
        boolean exists = sysOrgService.exists(queryWrapper);
        if(exists){
            return ReturnT.error("机构编号重复！");
        }
        sysOrg.setModUser(UserUtil.getCurrentUser().getId());
        sysOrg.setModTime(LocalDateTime.now());
        return ReturnT.ok(sysOrgService.updateById(sysOrg));
    }

    /**
     * 查询所有组织机构表。
     *
     * @return 所有数据
     */
    @Get
    @Mapping("/list")
    @ApiOperation("查询所有组织机构表")
    public ReturnT<List<SysOrg>> list() {
        return ReturnT.ok(sysOrgService.list());
    }

    /**
     * 根据组织机构表主键获取详细信息。
     *
     * @param id 组织机构表主键
     * @return 组织机构表详情
     */
    @Get
    @Mapping("/getInfo/{id}")
    @ApiOperation("根据主键获取组织机构表")
    public ReturnT<SysOrg> getInfo(@Path @ApiParam("组织机构表主键") String id) {
        return ReturnT.ok(sysOrgService.getById(id));
    }

    /**
     * 分页查询组织机构表。
     *
     * @param parameter 分页对象
     * @return 分页对象
     */
    @Post
    @Mapping("/page")
    @ApiOperation("分页查询组织机构表")
    public ReturnT<Page<SysOrg>> page(@Body @ApiParam("分页信息") PageParameter<SysOrg> parameter) {
        return ReturnT.ok(sysOrgService.queryByPage(parameter));
    }

    /**
     * 获取树形机构
     *
     * @return 树形机构
     */
    @ApiOperation("查询树形机构")
    @Get
    @Mapping("/treeList/{tenantId}")
    public ReturnT<List<SysOrg>> treeList(@Path("tenantId") String tenantId){
        if (!AdminConstant.SUPER_ADMIN_TENANT_ID.equals(UserUtil.getCurrentUser().getTenantId())) {
            return ReturnT.ok(sysOrgService.getAllOrgTree(UserUtil.getCurrentUser().getTenantId()));
        } else {
            return ReturnT.ok(sysOrgService.getAllOrgTree());
        }
    }

    /**
     * 根据租户查询树形机构
     * @param tenantId 租户id
     * @return 结果
     */
    @ApiOperation("根据租户查询树形机构")
    @Get
    @Mapping("/treeListByTenantId/{tenantId}")
    public ReturnT<List<SysOrg>> treeListByTenantId(@Path("tenantId") String tenantId){
        return ReturnT.ok(sysOrgService.getAllOrgTree(tenantId));
    }
}
